Skip to content

Stone theorem for norm-continuous unitary one-parameter groups - #1510

Open
TomOleDiem wants to merge 13 commits into
leanprover-community:masterfrom
TomOleDiem:port-stone-theorem
Open

Stone theorem for norm-continuous unitary one-parameter groups#1510
TomOleDiem wants to merge 13 commits into
leanprover-community:masterfrom
TomOleDiem:port-stone-theorem

Conversation

@TomOleDiem

@TomOleDiem TomOleDiem commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR proves the bounded-generator form of Stone theorem for norm-continuous unitary one-parameter groups.

  • OneParameterSubgroup.apply_eq_exp_smul_deriv proves the underlying Banach-algebra result for a continuous AddChar.
  • UnitaryOneParameterGroup bundles an AddChar into the Mathlib unitary subgroup and coerces directly to bounded operators. Its canonical generator is self-adjoint, satisfies U(t) = exp(-itA), and is unique. The converse construction and stoneEquiv give the correspondence.
  • FiniteTarget.unitaryTimeEvolution specializes the general result to time translations. Its generator is H/ℏ, giving U(t) = exp(-itH/ℏ).

The general unitary-group result is not specific to Hamiltonians: the same structure covers bounded generators of translations and rotations. The Hamiltonian interpretation therefore stays in FiniteTarget, while the reusable correspondence lives under Mathematics/OneParameterSubgroups.

This is the norm-continuous/bounded case. The strongly continuous theorem with unbounded generators requires spectral theory that is not yet available in Physlib.

TomOleDiem and others added 2 commits August 12, 2026 00:02
…ne-parameter groups)

Physlib/Mathematics/OneParameterSubgroups/Basic.lean (new):
- OneParameterSubgroup.existsUnique_generator: every continuous one-parameter subgroup of a
  real Banach algebra's unit group is exp(t . A) for a unique generator A. Pure Banach-algebra
  content, no physics, reusable well beyond quantum mechanics.

Physlib/Mathematics/OneParameterSubgroups/Matrix.lean (new):
- Specializes the above to complex matrices via the Frobenius norm, identifying real scalar
  multiplication with multiplication by real complex numbers.

Physlib/QuantumMechanics/Stone.lean (new):
- Matrix.UnitaryOneParameterSubgroup and the finite-dimensional Stone correspondence: a
  continuous one-parameter subgroup of U(n) has a unique anti-Hermitian generator A
  (equivalently, after multiplying by i, a unique Hermitian generator H with
  U(t) = exp(-itH)) -- existsUnique_antiHermitian_generator / existsUnique_hermitian_generator.
- The converse direction, ofHermitian: every Hermitian H genuinely generates a continuous
  U(n)-valued one-parameter subgroup t -> exp(-itH), bundled as a real ContinuousMonoidHom
  (built via MonoidHom.codRestrict + Continuous.subtype_mk, sidestepping Mathlib's lack of a
  canonical matrix norm by routing the exp-additivity/continuity proofs through
  Matrix.exp_add_of_commute's own `open scoped Norms.Operator` pattern rather than the
  ambient default instance).
- stoneEquiv: the finite-dimensional statement of Stone's theorem itself, as a genuine
  Equiv between U(n)'s continuous one-parameter subgroups and the Hermitian n x n matrices --
  the algebraic reason a Hermitian Hamiltonian generates unitary time evolution, specialized
  to finite-level (e.g. qubit) quantum systems.

All new theorems kernel-checked (#print axioms): only propext, Classical.choice, Quot.sound.
Zero sorry.
…bra instance

- Basic.lean: the module doc referenced a now-deleted Unitary.lean; point it at
  Physlib.QuantumMechanics.Stone instead. Drop private from all 8 internal
  lemmas (ambientValue and friends) -- physlib's module system makes private
  declarations brittle, and there's no reason these helper lemmas need to be
  hidden. Hoist the NormedAlgebra ℚ E instance (needed for NormedSpace.exp's
  API) to a single local instance declared once, instead of duplicating the
  same 'let +nondep' inline in both exists_generator_of_nontrivial and
  existsUnique_generator.
- Stone.lean: add a reference to Stone's original 1932 theorem.

Re-verified: targeted build of all 3 files, full Physlib aggregate build,
#print axioms on the 6 key public theorems (only propext/Classical.choice/
Quot.sound), and empty sorry/private greps -- all clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Thank you for this pull-request (PR). If this is your first PR, welcome to the community!

Below is what will happen next. Please read carefully if you are not familiar with the process. You may open other PRs while this one is being reviewed, and can stack PRs on top of each other, so don't let these steps slow you down.

  1. Some automated checks will be run on your PR. You can see the results of these checks at the buttom of your PR page. If any of these checks fail, you will need to fix the issues before your PR can be merged. You can learn more about these here, including how to run them locally, which is sometimes quicker than relying on the GitHub Actions. If you have never had a PR merged before, you may have to wait for a reviewer to manually start these checks (this is for security).

  2. A reviewer will look at your PR and may ask you to make changes. This may happen a couple of days after you submit your PR, so you may need to be patient. But it should not be longer than that - if it is please bring it to the attention of the community on the Zulip. The level of review will depend on where your PR is submitted. If it is submitted to ./Physlib or ./QuantumInfo, the review will be more thorough than if it is submitted to ./PhyslibAlpha. You can find out more about what the review process is looking for in our review guidelines. If a reviewer adds an awaiting-author label to your PR, address the review comments, then please remove that label by adding a comment with -awaiting-author. This helps us keep track of reviews.

  3. The reviewer will either approve your PR, or request more changes (in which case we return to step 2). Once your PR is approved, it will be merged by a maintainer, this should happen shortly after approval, though you may get more comments at this stage.

Tip: The easiest way to get have a fast review is to submit a PR that is small and self-contained, and has clear documentation explaining why things are the way they are in your chages.

If you have any problems or questions, please reach out to the community on the Zulip.

Document the helper definitions and remove the unused Fintype assumption from Matrix.IsAntiHermitian.

Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
@jstoobysmith
jstoobysmith requested a review from gloges August 12, 2026 04:09
@jstoobysmith

Copy link
Copy Markdown
Member

Many thanks for this PR.
Just some quick comments which I think need addressing before merging or getting into the details:

  1. In Physlib we use lemma instead of theorem.
  2. Might be worth running min_import at the bottom of each file to reduce the number of imports.
  3. Worth checking for definitions which are simple rephrasing of things in mathlib e.g. oneParameterNormedRing.
  4. Worth checking how much of this one-parameter subgroup stuff can be taken from Mathlib, rather then needing to include it here.

@jstoobysmith

Copy link
Copy Markdown
Member

awaiting-author

@github-actions github-actions Bot added the awaiting-author A reviewer has asked the author a question or requested changes label Aug 12, 2026
Use lemma declarations throughout and remove imports reported as redundant by Mathlib's import analysis.

Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
@jstoobysmith

jstoobysmith commented Aug 12, 2026

Copy link
Copy Markdown
Member

The final result here is really great work. Though, I do have a couple of concerns that still make it a bit hard to review in its current form:

  1. Connection to existing quantum mechanics API: This doesn't currently link up with the self-adjoint operators that already exist in the codebase. I'd expect this result to build on/connect to those. Could you take a look at how they're structured and see if we can tie this in? This may also mean moving the file you added to the right place.

  2. Framing as physics vs. math: Right now this reads as an API around mathematics rather than physics. I think there's a lot of useful physics we could surface here if we frame it a bit differently — could we look at adjusting the naming/structure/organization to make the physical meaning clearer?

TomOleDiem and others added 5 commits August 12, 2026 19:14
Use the physical exp(-itH/ℏ) normalization, connect the result to FiniteTarget time evolution, and explain its scope relative to unbounded QuantumSystem Hamiltonians.

Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Present only the physically normalized Hamiltonian statement in the module overview.

Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Fold the anti-Hermitian and natural-units existence arguments into existsUnique_hamiltonian so the public API has one generator theorem normalized by ℏ.

Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
Co-authored-by: Claude Opus 4.8 <no-reply+claude-opus-4-8@anthropic.com>
@TomOleDiem

Copy link
Copy Markdown
Contributor Author

Thanks for your patience. I am still getting familiar with Lean and with Physlib’s file and folder structure.

I have reworked Stone.lean so the main result is now basis-independent and phrased directly in terms of physics: continuous unitary time evolution corresponds to a unique bounded self-adjoint Hamiltonian through

$$U(t)=\exp(-itH/\hbar).$$

It now works with bounded operators on a Hilbert space and is connected directly to FiniteTarget.timeEvolution. The general unbounded version would require spectral theory and strong operator continuity that are not yet available in Physlib.

I have left the two underlying one-parameter subgroup files under Mathematics. I’m happy to hear any other ideas for how this result could be integrated more naturally into Physlib.

@TomOleDiem

Copy link
Copy Markdown
Contributor Author

-awaiting-author

@github-actions github-actions Bot removed the awaiting-author A reviewer has asked the author a question or requested changes label Aug 12, 2026
Comment thread Physlib/QuantumMechanics/UnitaryTimeEvolution.lean Outdated
Comment thread Physlib/QuantumMechanics/Stone.lean Outdated
Comment thread Physlib/QuantumMechanics/Stone.lean Outdated
@jstoobysmith

Copy link
Copy Markdown
Member

awaiting-author

@github-actions github-actions Bot added the awaiting-author A reviewer has asked the author a question or requested changes label Aug 13, 2026

@gloges gloges left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for making headway on Stone's theorem!
There is a lot that needs to be cleaned up to best utilize the existing Mathlib machinery and reduce redundancy. The fundamental issue is that these results should be phrased in terms of AddChar, not the MonoidHomClass/Multiplicative combo currently being used.

Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Matrix.lean Outdated
Comment thread Physlib/QuantumMechanics/Stone.lean Outdated
Comment thread Physlib/QuantumMechanics/Stone.lean Outdated
@TomOleDiem

Copy link
Copy Markdown
Contributor Author

Thanks for all these comments. I have reworked the PR to incorporate the feedback:

  • the general result now uses Mathlib’s AddChar;
  • I removed the redundant matrix file and the definitions duplicating existing Mathlib machinery;
  • the physics result now lives in UnitaryTimeEvolution.lean;
  • UnitaryTimeEvolution directly exposes the group laws U(0) = 1, U(s+t) = U(s)U(t), and U(-t) = U(t)⁻¹;
  • the correspondence is phrased in terms of bounded self-adjoint Hamiltonians and integrated with FiniteTarget.timeEvolution.

Thanks again for the detailed guidance.

-awaiting-author

@github-actions github-actions Bot removed the awaiting-author A reviewer has asked the author a question or requested changes label Aug 13, 2026

@gloges gloges left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, things look much better now with AddChar!
I've made another pass through making comments/suggests - at this point those for OneParameterSubgroups are more stylistic and should help to improve the proofs (this will make life easier in the future).

Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/Mathematics/OneParameterSubgroups/Basic.lean Outdated
Comment thread Physlib/QuantumMechanics/UnitaryTimeEvolution.lean Outdated
Comment thread Physlib/QuantumMechanics/UnitaryTimeEvolution.lean Outdated
Comment thread Physlib/QuantumMechanics/UnitaryTimeEvolution.lean Outdated

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should limit ourselves to only time evolution/Hamiltonians since everything in this file applies equally well, for example, to translation/momenta.

Also, throughout the file you are casting U t to type H →L[ℂ] H. This suggests to me that the CoeFun needs to be changed or the definition adjusted to something like

structure UnitaryFoo (H : Type*) [NormedAddCommGroup H] [InnerProductSpace ℂ H]
    [CompleteSpace H] where
  /-- The additive character sending time to its unitary evolution operator. -/
  toAddChar : AddChar ℝ (H →L[ℂ] H)
  /-- foo -/
  selfAdjoint : ∀ t, IsSelfAdjoint (toAddChar t)
  /-- Time evolution is continuous in the operator norm. -/
  continuous : Continuous toAddChar

Comment thread Physlib/QuantumMechanics/UnitaryTimeEvolution.lean Outdated
@gloges gloges added the awaiting-author A reviewer has asked the author a question or requested changes label Aug 14, 2026
@TomOleDiem TomOleDiem changed the title Stone's theorem, finite-dimensional form (Hermitian ⟺ unitary one-parameter groups) Stone theorem for norm-continuous unitary one-parameter groups Aug 14, 2026
@TomOleDiem

Copy link
Copy Markdown
Contributor Author

Thanks for all the detailed comments. I made a final structural pass through the PR and reworked the result around the more general object.

The central definition is now UnitaryOneParameterGroup, under Mathematics/OneParameterSubgroups. It stores an AddChar into the Mathlib unitary subgroup, while its coercion returns the underlying continuous linear operator, so expressions read simply as U t without repeated casts. I kept unitarity as the intrinsic condition here, since the operators U(t) are generally not self-adjoint.

The long existsUnique_hamiltonian proof has been removed. The API now defines the canonical self-adjoint generator, proves U(t) = exp(-itA), proves uniqueness, constructs a group from any bounded self-adjoint operator, and packages the correspondence as stoneEquiv.

Hamiltonians are now treated as the time-translation specialization rather than as part of the general theorem. FiniteTarget.unitaryTimeEvolution is generated by H/ℏ; this is exposed directly by unitaryTimeEvolution_generator, and the existing formula U(t) = exp(-itH/ℏ) follows from the general result.

I also incorporated the proof-structure suggestions in OneParameterSubgroups/Basic: the integral calculation is a calc, translation of the interval integral is a separate lemma, and the generator and uniqueness arguments have fewer intermediate facts. The redundant matrix specialization remains removed.

This seems to give a cleaner separation between the reusable Stone correspondence and its physical interpretation as time evolution. I am happy to adjust the placement or naming if you would prefer a different organization.

-awaiting-author

@github-actions github-actions Bot removed the awaiting-author A reviewer has asked the author a question or requested changes label Aug 14, 2026

@gloges gloges left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few minor suggestions for OneParameterSubgroups/Basic.lean.
Even more than before I think that the definition of UnitaryOneParameterGroup is not yet optimal - I've played around a bit with it and have left my suggestion below.
Also, a general comment is that many of the dsimp and change lines can simply be removed.

∃ d : ℝ, 0 < d ∧ IsUnit (∫ x in (0 : ℝ)..d, U x) := by
let c : ℝ := ‖(1 : E)‖⁻¹ / 2
have hone : 0 < ‖(1 : E)‖ := norm_pos_iff.mpr one_ne_zero
have hc : 0 < c := by dsimp [c]; positivity

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
have hc : 0 < c := by dsimp [c]; positivity
have hc : 0 < c := by positivity

rw [Metric.eventually_nhds_iff] at hevent
obtain ⟨r, hr, hrU⟩ := hevent
let d := r / 2
have hd : 0 < d := by dsimp [d]; positivity

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
have hd : 0 < d := by dsimp [d]; positivity
have hd : 0 < d := by positivity

Comment on lines +77 to +80
calc
‖(∫ x in (0 : ℝ)..d, U x) - (q : E)‖ =
‖(∫ x in (0 : ℝ)..d, U x) - d • (1 : E)‖ := rfl
_ = ‖(∫ x in (0 : ℝ)..d, U x) - ∫ _x in (0 : ℝ)..d, (1 : E)‖ := by

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
calc
‖(∫ x in (0 : ℝ)..d, U x) - (q : E)‖ =
‖(∫ x in (0 : ℝ)..d, U x) - d • (1 : E)‖ := rfl
_ = ‖(∫ x in (0 : ℝ)..d, U x) - ∫ _x in (0 : ℝ)..d, (1 : E)‖ := by
calc
_ = ‖(∫ x in (0 : ℝ)..d, U x) - d • (1 : E)‖ := rfl
_ = ‖(∫ x in (0 : ℝ)..d, U x) - ∫ _x in (0 : ℝ)..d, (1 : E)‖ := by

Comment on lines +85 to +94
_ ≤ c * d := by
calc
_ ≤ c * |d - 0| := intervalIntegral.norm_integral_le_of_norm_le_const (fun x hx => by
apply le_of_lt
apply hrU
rw [Real.dist_0_eq_abs]
rw [Set.uIoc_of_le hd.le] at hx
rw [abs_of_nonneg hx.1.le]
exact hx.2.trans_lt (by dsimp [d]; linarith))
_ = c * d := by rw [sub_zero, abs_of_pos hd]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
_ ≤ c * d := by
calc
_ ≤ c * |d - 0| := intervalIntegral.norm_integral_le_of_norm_le_const (fun x hx => by
apply le_of_lt
apply hrU
rw [Real.dist_0_eq_abs]
rw [Set.uIoc_of_le hd.le] at hx
rw [abs_of_nonneg hx.1.le]
exact hx.2.trans_lt (by dsimp [d]; linarith))
_ = c * d := by rw [sub_zero, abs_of_pos hd]
_ ≤ c * |d - 0| := sorry
_ = c * d := by rw [sub_zero, abs_of_pos hd]

No need to nest calc blocks like this - add intermediate steps if they are useful!

Comment on lines +95 to +102
_ < ‖(↑q⁻¹ : E)‖⁻¹ := by
have hright : ‖(↑q⁻¹ : E)‖⁻¹ = d * ‖(1 : E)‖⁻¹ := by
change ‖d⁻¹ • (1 : E)‖⁻¹ = _
rw [norm_smul, Real.norm_eq_abs, abs_inv, abs_of_pos hd]
field_simp
rw [hright]
dsimp [c]
nlinarith [inv_pos.mpr hone]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
_ < ‖(↑q⁻¹ : E)‖⁻¹ := by
have hright : ‖(↑q⁻¹ : E)‖⁻¹ = d * ‖(1 : E)‖⁻¹ := by
change ‖d⁻¹ • (1 : E)‖⁻¹ = _
rw [norm_smul, Real.norm_eq_abs, abs_inv, abs_of_pos hd]
field_simp
rw [hright]
dsimp [c]
nlinarith [inv_pos.mpr hone]
_ < d * ‖(1 : E)‖⁻¹ := by dsimp [c]; nlinarith [inv_pos.mpr hone]
_ = ‖q.inv‖⁻¹ := by simp [q, norm_smul, mul_comm, abs_of_pos hd]

Same here.

Comment on lines +108 to +112
let L : E →L[ℝ] E :=
(LinearMap.mulLeft ℝ (U s)).mkContinuous ‖U s‖ (fun x => norm_mul_le _ _)
calc
U s * ∫ x in (0 : ℝ)..t, U x = L (∫ x in (0 : ℝ)..t, U x) := rfl
_ = ∫ x in (0 : ℝ)..t, L (U x) :=

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let L : E →L[ℝ] E :=
(LinearMap.mulLeft ℝ (U s)).mkContinuous ‖U s‖ (fun x => norm_mul_le _ _)
calc
U s * ∫ x in (0 : ℝ)..t, U x = L (∫ x in (0 : ℝ)..t, U x) := rfl
_ = ∫ x in (0 : ℝ)..t, L (U x) :=
let L : E →L[ℝ] E := (LinearMap.mulLeft ℝ (U s)).mkContinuous ‖U s‖ (fun x => norm_mul_le _ _)
calc
_ = L (∫ x in (0 : ℝ)..t, U x) := rfl
_ = ∫ x in (0 : ℝ)..t, L (U x) :=

Best to keep the =/≤/≥ aligned in calc.

Comment on lines +42 to +59
/-- A norm-continuous unitary one-parameter group on a complex Hilbert space. -/
structure UnitaryOneParameterGroup (H : Type*) [NormedAddCommGroup H] [InnerProductSpace ℂ H]
[CompleteSpace H] where
/-- The additive character from the real parameter to unitary operators. -/
toAddChar : AddChar ℝ (unitary (H →L[ℂ] H))
/-- The group is continuous in the operator norm. -/
continuous : Continuous toAddChar

namespace UnitaryOneParameterGroup

variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℂ H] [CompleteSpace H]

instance : CoeFun (UnitaryOneParameterGroup H) fun _ => ℝ → (H →L[ℂ] H) :=
⟨fun U t => U.toAddChar t⟩

/-- The operator-valued additive character underlying a unitary one-parameter group. -/
def operatorAddChar (U : UnitaryOneParameterGroup H) : AddChar ℝ (H →L[ℂ] H) :=
(unitary (H →L[ℂ] H)).subtype.compAddChar U.toAddChar

@gloges gloges Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, that you find it necessary to define operatorAddChar suggests that the definition of UnitaryOneParameterGroup is not yet "correct" (in the sense of best serving its use cases).

I've tinkered a bit with this and feel strongly that the starting point should be

Suggested change
/-- A norm-continuous unitary one-parameter group on a complex Hilbert space. -/
structure UnitaryOneParameterGroup (H : Type*) [NormedAddCommGroup H] [InnerProductSpace ℂ H]
[CompleteSpace H] where
/-- The additive character from the real parameter to unitary operators. -/
toAddChar : AddChar ℝ (unitary (H →L[ℂ] H))
/-- The group is continuous in the operator norm. -/
continuous : Continuous toAddChar
namespace UnitaryOneParameterGroup
variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℂ H] [CompleteSpace H]
instance : CoeFun (UnitaryOneParameterGroup H) fun _ => ℝ → (H →L[ℂ] H) :=
⟨fun U t => U.toAddChar t⟩
/-- The operator-valued additive character underlying a unitary one-parameter group. -/
def operatorAddChar (U : UnitaryOneParameterGroup H) : AddChar ℝ (H →L[ℂ] H) :=
(unitary (H →L[ℂ] H)).subtype.compAddChar U.toAddChar
/-- A norm-continuous unitary one-parameter group on a complex Hilbert space. -/
structure UnitaryOneParameterGroup (H : Type*) [NormedAddCommGroup H] [InnerProductSpace ℂ H]
[CompleteSpace H] where
/-- The additive character from the real parameter to unitary operators. -/
toAddChar : AddChar ℝ (H →L[ℂ] H)
/-- foo -/
mem_unitary : ∀ t, toAddChar t ∈ unitary (H →L[ℂ] H)
/-- The group is continuous in the operator norm. -/
continuous : Continuous toAddChar
namespace UnitaryOneParameterGroup
variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℂ H] [CompleteSpace H]
attribute [coe] UnitaryOneParameterGroup.toAddChar
instance : CoeFun (UnitaryOneParameterGroup H) fun _ => ℝ → (H →L[ℂ] H) := ⟨fun U => U.toAddChar⟩

(I think early I mistakenly wrote something like this with self-adjoint in place of unitary - sorry for the confusion! If something doesn't make sense please feel free to ask.) See below for an example of how the unitary property can be used in proofs.

Comment on lines +76 to +82
@[simp]
lemma adjoint_eq (U : UnitaryOneParameterGroup H) (t : ℝ) :
ContinuousLinearMap.adjoint (U t) = U (-t) := by
change star (U t) = U (-t)
apply left_inv_eq_right_inv (U.toAddChar t).property.1
have h := congrArg Subtype.val (U.toAddChar.map_add_eq_mul t (-t))
simpa using h.symm

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
@[simp]
lemma adjoint_eq (U : UnitaryOneParameterGroup H) (t : ℝ) :
ContinuousLinearMap.adjoint (U t) = U (-t) := by
change star (U t) = U (-t)
apply left_inv_eq_right_inv (U.toAddChar t).property.1
have h := congrArg Subtype.val (U.toAddChar.map_add_eq_mul t (-t))
simpa using h.symm
@[simp]
lemma adjoint_eq (U : UnitaryOneParameterGroup H) (t : ℝ) : (U t).adjoint = U (-t) := by
apply left_inv_eq_right_inv <| star_mul_self_of_mem <| U.mem_unitary t
simp [← AddChar.map_add_eq_mul]

An example of using UnitaryOneParameterGroup.mem_unitary.

Comment on lines +84 to +86
/-- The bounded self-adjoint generator of `U`, in the convention `U(t) = exp (-itA)`. -/
noncomputable def generator (U : UnitaryOneParameterGroup H) : H →L[ℂ] H :=
Complex.I • deriv U.operatorAddChar 0

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good idea! You can probably just write deriv U 0, making use of the coercions.

Comment on lines +88 to +89
lemma deriv_star_eq_neg (U : UnitaryOneParameterGroup H) :
star (deriv U.operatorAddChar 0) = -deriv U.operatorAddChar 0 := by

@gloges gloges Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
lemma deriv_star_eq_neg (U : UnitaryOneParameterGroup H) :
star (deriv U.operatorAddChar 0) = -deriv U.operatorAddChar 0 := by
lemma adjoint_deriv_eq_neg (U : UnitaryOneParameterGroup H) :
(deriv U 0).adjoint = -deriv U 0 := by

@gloges gloges added the awaiting-author A reviewer has asked the author a question or requested changes label Aug 15, 2026
@TomOleDiem

Copy link
Copy Markdown
Contributor Author

Thanks for your suggestions!
I think I have incorporated them as much as possible.
"U.toAddChar" Im still using in one or two places. I wasn't able to get completely rid of them.
-awaiting-author

@github-actions github-actions Bot removed the awaiting-author A reviewer has asked the author a question or requested changes label Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants